iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Mobile Development

Android studio 30天新手筆記系列 第 13

Day13-Android新手筆記-Intent & Bundle

  • 分享至 

  • xImage
  •  

Intent通常可分為兩種用法,第一種是平時常用來啟動我們程式中的其他Activity;第二種則是用來執行一些特殊動作(如:撥號、開啟網頁、開啟地圖等等),系統會自動匹配對應的Activity。
今天介紹第一種的使用方法,Intent切換Activity的方法其實挺簡單,只需短短兩行程式碼,直接以範例來說明:

/images/emoticon/emoticon31.gif

1.首先建立一個Activity,以下稱它為TestActivity。
2.於MainActivity加入這兩行程式碼,執行程式即可完成Activity的切換

Intent intent = new Intent(MainActivity.this,TestActivity.class);
startActivity(intent);

必要時,可以加上"finish();"就可以避免使用返回鍵跳回MainActivity的狀況。

Intent intent = new Intent(MainActivity.this,TestActivity.class);
startActivity(intent);
finish();

接下來上一個小範例:
XML布局檔

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MainActivity"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Java程式碼

public class MainActivity extends AppCompatActivity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,TestActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }
}

結果如下:

接下來將介紹如何在切換畫面時,將資料一並傳送過去。在這個地方有兩個較常見的方法。第一種方法是利用Intent自帶的putExtra,可以直接傳送基本的型態;第二種方法透過Bundle物件,將欲傳送的資料放入Bundle,在透過putExtra一次傳送,Bundle還可以傳送除了基本的型態以外的物件。

1.單純使用Intent自帶的putExtra傳送資料

//傳送方
Intent intent = new Intent(MainActivity.this,TestActivity.class);
intent.putExtra("valueStr","testtest");
startActivity(intent);
finish();
//接收方
Intent intent = this.getIntent();
String valueStrResponse = intent.getStringExtra("valueStr");
Log.v("Test",valueStrResponse);

2.使用Bundle,透過putExtra傳送資料

//傳送方
Bundle bundle = new Bundle();
bundle.putInt("valueNum",123123);
bundle.putString("valueStr","testtest");

Intent intent = new Intent(MainActivity.this,TestActivity.class);
intent.putExtras(bundle);
startActivity(intent);
finish();
//接收方
Bundle bundle = this.getIntent().getExtras();
String valueStrResponse = bundle.getString("valueStr");
int valueNumResponse = bundle.getInt("valueNum");
Log.v("Test",valueStrResponse+" "+String.valueOf(valueNumResponse));

3.使用Bundle,透過putExtra傳送基本類型以外的資料
建立一個類別檔UserData

public class UserData implements Serializable{
    private String name;
    private String age;
    private String phone;

    public UserData(String name, String age, String phone) {
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

傳送與接收資料

//傳送方
UserData userData = new UserData("Allan","20","0900000000");
Bundle bundle = new Bundle();
bundle.putSerializable("valueUserData", userData);

Intent intent = new Intent(MainActivity.this,TestActivity.class);
                intent.putExtras(bundle);
startActivity(intent);
finish();
//接收方
UserData userDataResponse = (UserData) getIntent().getSerializableExtra("valueUserData");
Log.v("Test","姓名:"+userDataResponse.getName()+" 年齡:"+userDataResponse.getAge()+" 電話:"+userDataResponse.getPhone());

結果如下:

/images/emoticon/emoticon41.gif


上一篇
Day12-Android新手筆記-Spinner + Spinner客製化
下一篇
Day12-Android新手筆記-DataBinding
系列文
Android studio 30天新手筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言